<?php
/**
 * Created by PhpStorm.
 * User: yuanxr
 * Date: 2018/6/10
 * Time: 上午8:17
 */

namespace Utility;

class Gen
{
    /**
     * rand
     *
     * @param float $min 最小数
     * @param float $max 最大数
     * @return float 间于最小数和最大数之间的的随机数字
     */
    public function rand(float $min, float $max)
    {
        return mt_rand($min, $max);
    }

    /**
     * char
     *
     * @param integer $length 生成的随机字符串长度，默认4
     * @return string 按位数生成的随机字符串
     */
    public function char(int $length = 4)
    {
        return $this->_random('char', $length);
    }

    /**
     * number
     *
     * @param integer $length 生成的随机字符串长度，默认4
     * @return string 按位数生成的随机字符串
     */
    public function number(int $length = 4)
    {
        return $this->_random('number', $length);
    }

    /**
     * mixed
     *
     * @param integer $length 生成的随机字符串长度，默认8
     * @return string 按位数生成的随机字符串
     */
    public function mixed(int $length = 8)
    {
        return $this->_random('mixed', $length);
    }

    /**
     * chinese
     *
     * @param integer $length 生成的随机字符串长度，默认3
     * @return string 按位数生成的随机字符串（生成GB2312编码的汉字后，再转码为UTF-8编码）
     */
    public function chinese(int $length = 3)
    {
        $result = '';
        for ($i=0; $i<$length; $i++) {
            // 使用chr()函数拼接双字节汉字，前一个chr()为高位字节，后一个为低位字节
            $gb2312 = chr(mt_rand(0xB0, 0xD0)).chr(mt_rand(0xA1, 0xF0));

            // 转码
            $result .= iconv('GB2312', 'UTF-8', $gb2312);
        }
        return $result;
    }

    /**
     * orderid
     *
     * @return string 由4位随机字母 + 10位时间戳组成的订单号
     */
    public function orderid()
    {
        return $this->char() . time();
    }

    /**
     * batch
     *
     * @param string $type 生成的随机字符串类型（可取值：char, number, mixed），默认mixed
     * @param integer $length 生成的随机字符串长度
     * @param integer $count 生成的数量
     * @return array 批量生成的随机字符串数组
     */
    public function batch(string $type, int $length, int $count)
    {
        // 如果type的值不正确，则默认使用mixed
        if ($type != 'char' && $type != 'number' && $type != 'mixed') {
            $type = 'mixed';
        }

        // 生成数组并返回
        $list = [];
        $this->_batch($type, $length, $count, $list);
        return $list;
    }

    /**
     * _batch
     */
    private function _batch(string $type, int $length, int $count, &$list)
    {
        $current = count($list);
        for ($i = 0; $i < $count - $current; $i++) {
            $list[] = $this->_random($type, $length);
        }
        array_unique($list);
        if (count($list) < $count) {
            $this->batch($type, $length, $count, $list);
        }
    }

    /**
     * _random
     */
    private function _random(string $type, int $length = 8)
    {
        $char = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
        $number = '0123456789';
        $mixed = 'ABCDEFGHJKLMNPQRSTUVWXYZ23456789';
        $source = $$type;
        $result = '';
        for ($i = 0; $i < $length; $i++) {
            $result .= substr($source, mt_rand(0, strlen($source) - 1), 1);
        }
        return $result;
    }

    /**
     * time13
     *
     * @return int 13位时间戳（到毫秒）
     */
    public function time13(){
        return round(microtime(true), 3) * 1000;
    }
    
    /**
     * time14
     * 
     * @return float 14位时间戳（到微秒，毫秒之后是小数，有可能有小数，也有可能没有）
     */
    public function time14() {
        return round(microtime(true), 4) * 1000;
    }
    

}
